package bytecode;

import java.util.Date;

/**
 * 针对于invokevirtua1方法调用动分配的过程，虚拟机会在类的方法区建立一个虚方法的数据结构（virtual method table ，vtable）
 * 针对于invokeinterface指令来说，虚拟机会建立一个叫做接口方法表的数据结构（invokeinterface method table，itable）
 *
 *
 * 方法的动态分派
 * 方法的动态分派涉及到一个重要概念:方法接收者。
 * invokevirtua1字节码指令的多态查找流程
 * 比较方法重载(overload)与方法重写(overwrite) ,我们可以得到这样一个结论:
 * 方法重载是静态的,是编译期行为;
 * 方法重写是动态的,是运行期行为。
 */
/*
main <Code>
 0 new #2 <bytecode/Animal>
 3 dup
 4 invokespecial #3 <bytecode/Animal.<init>>
 7 astore_1
 8 new #4 <bytecode/Dog>
11 dup
12 invokespecial #5 <bytecode/Dog.<init>>
15 astore_2
16 aload_1
17 ldc #6 <heka>
19 invokevirtual #7 <bytecode/Animal.test>
22 aload_2
23 new #8 <java/util/Date>
26 dup
27 invokespecial #9 <java/util/Date.<init>>
30 invokevirtual #10 <bytecode/Animal.test>
33 return

 */
public class MyTest7 {

    public static void main(String[] args) {
        Animal animal = new Animal();
        Animal dog = new Dog();

        animal.test("heka");
        dog.test(new Date());
    }
}

class Animal {
    public void test(String str){
        System.out.println("animal str");
    }
    public void test(Date date){
        System.out.println("animal date");
    }
}

class Dog extends Animal{
    public void test(String str){
        System.out.println("dog str");
    }
    public void test(Date date){
        System.out.println("dog date");
    }
}
